package org.softmed.rest.editor.comps.browser;

import java.awt.event.MouseListener;
import java.util.List;

import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;

import org.softmed.rest.editor.EditorUtil;
import org.softmed.rest.editor.commons.SwingUtil;
import org.softmed.rest.editor.config.Application;
import org.softmed.rest.editor.config.Handler;
import org.softmed.rest.editor.config.HttpMethod;
import org.softmed.rest.editor.config.MimeTypeHandler;
import org.softmed.rest.editor.config.Module;
import org.softmed.rest.editor.config.Parameter;
import org.softmed.rest.editor.config.Resource;

public class ItemList extends JPanel {

	JScrollPane scrollPane;
	JTable table;
	ReflectionTableModel tableModel = new ReflectionTableModel();

	public ItemList() {
		table = new JTable(tableModel);
		// table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
		table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		table.setAutoCreateColumnsFromModel(true);

		scrollPane = new JScrollPane(table);
		table.setFillsViewportHeight(true);
		add(scrollPane);

		SwingUtil.setSize(this, EditorUtil.restBrowserWidth, 515);
		SwingUtil.setSize(scrollPane, EditorUtil.restBrowserWidth, 505);
	}

	public void setPagedList(PagedList plist) throws Throwable {

		tableModel.clear();
		tableModel.fireTableStructureChanged();

		List items = plist.getItems();
		if (items == null || items.size() == 0)
			return;

		Object first = items.get(0);
		tableModel.prepare(first.getClass());
		tableModel.getList().addAll(items);

		configureTable(first);

		revalidate();

		// repaint();

	}

	private void configureTable(Object object) throws Throwable {

		if (object instanceof Application || object instanceof Module) {
			tableModel.getFields().add("id");
			tableModel.getFields().add("active");
			tableModel.getFields().add("name");
			tableModel.getFields().add("relativeUri");

			tableModel.getColumnTitle().add("ID");
			tableModel.getColumnTitle().add("Act");
			tableModel.getColumnTitle().add("Name");
			tableModel.getColumnTitle().add("Relative-URI");

		} else if (object instanceof Resource) {

			tableModel.getFields().add("id");
			tableModel.getFields().add("active");
			tableModel.getFields().add("targetUri");

			tableModel.getColumnTitle().add("ID");
			tableModel.getColumnTitle().add("Act");
			tableModel.getColumnTitle().add("Target-URI");

		} else if (object instanceof HttpMethod) {

			tableModel.getFields().add("id");
			tableModel.getFields().add("active");
			tableModel.getFields().add("name");

			tableModel.getColumnTitle().add("ID");
			tableModel.getColumnTitle().add("Act");
			tableModel.getColumnTitle().add("Name");

		} else if (object instanceof MimeTypeHandler) {
			tableModel.getFields().add("id");
			tableModel.getFields().add("active");
			tableModel.getFields().add("mimeType");

			tableModel.getColumnTitle().add("ID");
			tableModel.getColumnTitle().add("Act");
			tableModel.getColumnTitle().add("Mime Type");

		} else if (object instanceof Handler) {

			tableModel.getFields().add("id");
			tableModel.getFields().add("active");
			tableModel.getFields().add("path");

			tableModel.getColumnTitle().add("ID");
			tableModel.getColumnTitle().add("Act");
			tableModel.getColumnTitle().add("Path");

		} else if (object instanceof Parameter) {
			tableModel.getFields().add("id");
			tableModel.getFields().add("active");
			tableModel.getFields().add("name");
			tableModel.getFields().add("value");

			tableModel.getColumnTitle().add("ID");
			tableModel.getColumnTitle().add("Act");
			tableModel.getColumnTitle().add("Name");
			tableModel.getColumnTitle().add("Value");

		}

		tableModel.fireTableStructureChanged();

		table.getColumnModel().getColumn(1).setCellRenderer(
				table.getDefaultRenderer(Boolean.class));

		setFixedColumnWidth(0, 30);
		setFixedColumnWidth(1, 30);

	}

	protected void setFixedColumnWidth(int index, int width) {
		table.getColumnModel().getColumn(index).setPreferredWidth(width);
		table.getColumnModel().getColumn(index).setMinWidth(width);
		table.getColumnModel().getColumn(index).setMaxWidth(width);
	}

	public void setEditorsMouseListener(MouseListener listener) {
		table.addMouseListener(listener);
	}

	public void removeEditorMouseListener(MouseListener listener) {
		table.removeMouseListener(listener);
	}

	public int getSelectedRow() {
		return table.getSelectedRow();
	}

	public Object getSelectedObject() {
		int index = table.getSelectedRow();
		if (index < 0)
			return null;

		Object object = tableModel.getList().get(index);
		return object;
	}

}
